home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-02-23 | 6.1 KB | 319 lines | [TEXT/MPS ] |
- # runtime.s - Runtime Support routines for Metrowerks C++ for PowerPC
- #
- # Copyright © 1993 metrowerks inc. All Rights Reserved.
- #
- #
- # BUILD INSTRUCTIONS
- #
- # To assemble this file:
- #
- # ppcasm runtime.s -o runtime.o
- #
- # The object file runtime.o can be added directly to any CodeWarrior™ project.
- #
-
- dialect powerpc
-
- #
- # Assembler Equates
- #
- cr0 equ 0
- cr1 equ 1
- cr2 equ 2
- cr3 equ 3
- cr4 equ 4
- cr5 equ 5
- cr6 equ 6
- cr7 equ 7
-
- #
- # Private Data
- #
- csect __constants{RO}
- dc.l 0x00000000 # 0.0
- dc.l 0x00000000
- dc.l 0x41F00000 # 2**32
- dc.l 0x00000000
- dc.l 0x41E00000 # 2**31
- dc.l 0x00000000
-
- #
- # TOC pointers
- #
- toc
- tc __constants{TC}, __constants{RO}
-
-
- # __cvt_fp2unsigned - convert floating-point to 32-bit unsigned integer
- #
- # Convert the floating-point value in F1 to a 32-bit unsigned integer
- # and return the result in R3.
- #
- # This routine is copied from the Motorola PowerPC 602 Users Manual, pg. F-1.
- #
- # We provide the synonym ".__uitrunc" for compatibility with PPCC.
- #
- csect .__cvt_fp2unsigned{PR}
- export .__cvt_fp2unsigned{PR}
- export .__uitrunc
-
- .__uitrunc:
- lwz r4,__constants{TC}(RTOC)
- li r3,0 # r3 = 0
- lfd fp0,0(r4) # fp0 = 0.0
- lfd fp3,8(r4) # fp3 = 2**32
- lfd fp4,16(r4) # fp4 = 2**31
- fcmpu cr0,fp1,fp0 # cr0 = compare(fp1,0.0)
- fcmpu cr6,fp1,fp3 # cr6 = compare(fp1,2**32)
- bltlr cr0 # return 0x00000000 if input was < 0.0
- addi r3,r3,-1
- bgelr cr6 # return 0xFFFFFFFF if input was >= 2**32
- fcmpu cr7,fp1,fp4 # cr7 = compare(fp1,2**31)
- fmr fp2,fp1
- blt cr7,$+8 # use fp1 if < 2**31
- fsub fp2,fp1,fp4 # subtract 2**31
- fctiwz fp2,fp2 # convert float to 8-byte integer
- stfd fp2,-8(SP) # store 8-byte integer
- lwz r3,-4(SP) # load 4-byte integer
- bltlr cr7
- addis r3,r3,-32768 # add 2**31 if input was >= 2**31
- blr
-
-
- # __ptr_glue - glue for function calls through pointers
- #
- # Call the function whose 2-word TVector address is in R12.
- #
- csect .__ptr_glue{GL}
- export .__ptr_glue{GL}
- lwz r0,0(r12)
- stw RTOC,20(SP)
- mtctr r0
- lwz RTOC,4(r12)
- bctr
-
-
- # _ptrgl12 - PPCC-compatible version of __ptr_glue
- #
- # Call the function whose 2-word TVector address is in R12.
- #
- csect ._ptrgl12{GL}
- export ._ptrgl12{GL}
- lwz r0,0(r12)
- stw RTOC,20(SP)
- mtctr r0
- lwz RTOC,4(r12)
- bctr
-
-
- # _ptrgl - PPCC-compatible version of __ptr_glue
- #
- # Call the function whose 3-word TVector address is in R11. R12 must be
- # set to point to the TVector on exit. The 3rd word of the TVector is ignored.
- # (This is different from the AIX convention)
- #
- csect ._ptrgl{GL}
- export ._ptrgl{GL}
- lwz r0,0(r11)
- stw RTOC,20(SP)
- mtctr r0
- lwz RTOC,4(r11)
- mr r12,r11
- bctr
-
-
- #
- # __save_fpr_XX - save FPR's XX through 31
- #
- csect .__save_fpr{PR}
- export .__save_fpr{PR}
- export .__save_fpr_14
- export ._savef14
- export .__save_fpr_15
- export ._savef15
- export .__save_fpr_16
- export ._savef16
- export .__save_fpr_17
- export ._savef17
- export .__save_fpr_18
- export ._savef18
- export .__save_fpr_19
- export ._savef19
- export .__save_fpr_20
- export ._savef20
- export .__save_fpr_21
- export ._savef21
- export .__save_fpr_22
- export ._savef22
- export .__save_fpr_23
- export ._savef23
- export .__save_fpr_24
- export ._savef24
- export .__save_fpr_25
- export ._savef25
- export .__save_fpr_26
- export ._savef26
- export .__save_fpr_27
- export ._savef27
- export .__save_fpr_28
- export ._savef28
- export .__save_fpr_29
- export ._savef29
- export .__save_fpr_30
- export ._savef30
- export .__save_fpr_31
- export ._savef31
- .__save_fpr_14:
- ._savef14:
- stfd fp14,-144(SP)
- .__save_fpr_15:
- ._savef15:
- stfd fp15,-136(SP)
- .__save_fpr_16:
- ._savef16:
- stfd fp16,-128(SP)
- .__save_fpr_17:
- ._savef17:
- stfd fp17,-120(SP)
- .__save_fpr_18:
- ._savef18:
- stfd fp18,-112(SP)
- .__save_fpr_19:
- ._savef19:
- stfd fp19,-104(SP)
- .__save_fpr_20:
- ._savef20:
- stfd fp20,-96(SP)
- .__save_fpr_21:
- ._savef21:
- stfd fp21,-88(SP)
- .__save_fpr_22:
- ._savef22:
- stfd fp22,-80(SP)
- .__save_fpr_23:
- ._savef23:
- stfd fp23,-72(SP)
- .__save_fpr_24:
- ._savef24:
- stfd fp24,-64(SP)
- .__save_fpr_25:
- ._savef25:
- stfd fp25,-56(SP)
- .__save_fpr_26:
- ._savef26:
- stfd fp26,-48(SP)
- .__save_fpr_27:
- ._savef27:
- stfd fp27,-40(SP)
- .__save_fpr_28:
- ._savef28:
- stfd fp28,-32(SP)
- .__save_fpr_29:
- ._savef29:
- stfd fp29,-24(SP)
- .__save_fpr_30:
- ._savef30:
- stfd fp30,-16(SP)
- .__save_fpr_31:
- ._savef31:
- stfd fp31,-8(SP)
- blr
-
-
- #
- # __restore_fpr_XX - restore FPR's XX through 31
- #
- csect .__restore_fpr{PR}
- export .__restore_fpr{PR}
- export .__restore_fpr_14
- export ._restf14
- export .__restore_fpr_15
- export ._restf15
- export .__restore_fpr_16
- export ._restf16
- export .__restore_fpr_17
- export ._restf17
- export .__restore_fpr_18
- export ._restf18
- export .__restore_fpr_19
- export ._restf19
- export .__restore_fpr_20
- export ._restf20
- export .__restore_fpr_21
- export ._restf21
- export .__restore_fpr_22
- export ._restf22
- export .__restore_fpr_23
- export ._restf23
- export .__restore_fpr_24
- export ._restf24
- export .__restore_fpr_25
- export ._restf25
- export .__restore_fpr_26
- export ._restf26
- export .__restore_fpr_27
- export ._restf27
- export .__restore_fpr_28
- export ._restf28
- export .__restore_fpr_29
- export ._restf29
- export .__restore_fpr_30
- export ._restf30
- export .__restore_fpr_31
- export ._restf31
- .__restore_fpr_14:
- ._restf14:
- lfd fp14,-144(SP)
- .__restore_fpr_15:
- ._restf15:
- lfd fp15,-136(SP)
- .__restore_fpr_16:
- ._restf16:
- lfd fp16,-128(SP)
- .__restore_fpr_17:
- ._restf17:
- lfd fp17,-120(SP)
- .__restore_fpr_18:
- ._restf18:
- lfd fp18,-112(SP)
- .__restore_fpr_19:
- ._restf19:
- lfd fp19,-104(SP)
- .__restore_fpr_20:
- ._restf20:
- lfd fp20,-96(SP)
- .__restore_fpr_21:
- ._restf21:
- lfd fp21,-88(SP)
- .__restore_fpr_22:
- ._restf22:
- lfd fp22,-80(SP)
- .__restore_fpr_23:
- ._restf23:
- lfd fp23,-72(SP)
- .__restore_fpr_24:
- ._restf24:
- lfd fp24,-64(SP)
- .__restore_fpr_25:
- ._restf25:
- lfd fp25,-56(SP)
- .__restore_fpr_26:
- ._restf26:
- lfd fp26,-48(SP)
- .__restore_fpr_27:
- ._restf27:
- lfd fp27,-40(SP)
- .__restore_fpr_28:
- ._restf28:
- lfd fp28,-32(SP)
- .__restore_fpr_29:
- ._restf29:
- lfd fp29,-24(SP)
- .__restore_fpr_30:
- ._restf30:
- lfd fp30,-16(SP)
- .__restore_fpr_31:
- ._restf31:
- lfd fp31,-8(SP)
- blr
-